import json
from http.client import responses

from langchain.chains.summarize.refine_prompts import prompt_template
from langchain.chat_models import init_chat_model
from langchain_core.messages import HumanMessage
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate, SystemMessagePromptTemplate, \
    MessagesPlaceholder

from entity.database.sqlite import ChatAssistant

history = [

]

async def use_model(api_key: str, user_input: str, history_id: int) -> str:
    """
    使用 deepseek v3  模型进行聊天
    user_input : 用户输入的文本
    return 模型的响应
    """
    model = init_chat_model(model="deepseek-v3",
                            model_provider="openai",
                            api_key=api_key,
                            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                            temperature=0.5,
                            max_tokens=200
                            )

    # prompt_template = ChatPromptTemplate.from_messages(
    #     [
    #         SystemMessagePromptTemplate.from_template(
    #             "你的名字是{ai_name}"
    #         ),
    #         HumanMessagePromptTemplate.from_template(
    #             "我的问题是{question}"
    #         )
    #     ]
    # )
    #
    # message = prompt_template.invoke({
    #     "ai_name": "小爱同学",
    #     "question": user_input
    # })
    #
    #
    #
    # prompt_text = """
    #         (C) 上下文：
    #         输入是一段包含公司信息的文本（如网页、文档、聊天记录等）。
    #         需要从中提取公司名称和公司电话，并确保数据准确无误。
    #
    #         (O) 目标：
    #         从文本中精准识别并提取公司名称和公司电话。
    #         输出纯JSON格式，不包含任何额外文本或解释。
    #
    #         (S) 风格：
    #         高度结构化，仅关注数据提取，不进行额外分析或描述。
    #
    #         (T) 语气：
    #         简洁、精准、无冗余，避免任何非必要的输出。
    #
    #         (A) 受众：
    #         自动化系统（如数据爬虫、API接口），需要直接解析JSON数据。
    #
    #         (R) 响应：
    #         仅输出JSON，格式如下：
    #         {{
    #           "companies": [
    #             {{
    #               "company_name": "提取的公司名称",
    #               "phone": "提取的电话号码"
    #             }}
    #           ]
    #         }}
    #
    #         禁止包含任何额外文本（如“以下是提取结果：”等）。
    #         也不要采用markdown格式，在json外层不要加任何标记或注释。
    # """
    #
    # prompt_template = ChatPromptTemplate.from_messages(
    #     [
    #         ("system", prompt_text),
    #         ("human", "我的问题是{question}")
    #     ]
    # )
    #
    # messages = prompt_template.invoke({"question":user_input})
    #
    # responses = model.invoke(input=messages)
    #
    # return responses.content

    prompt_text = """
    (C) 上下文：
    用户输入一段对话内容（如聊天记录/会议记录/访谈文字）
    
    (O) 目标：
    将对话内容提炼成3个核心要素：参与者、事件概要、结果
    
    (S) 风格：
    结构化摘要｜关键信息优先｜去除冗余修饰
    
    (T) 语气：
    客观精准｜无主观评价｜使用中性词汇
    
    (A) 受众：
    需要快速理解对话要点的商务/研究人员
    
    (R) 响应：
    [
    "销售总监A vs 客户B",
    "讨论产品报价和交付周期",
    "达成初步协议：报价降低5%，交货期延长2周"
    ]
    
    /// 生成规则 ///
    
    人物关系用"vs"或"与"连接
    事件概括不超过10字，动词用"讨论/协商/确认"等
    结果需包含具体数字（如金额/时间/百分比）
    若未达成一致则标注"未达成协议"
    数组元素顺序固定：[人物, 事件, 结果]
    示例输入：
    "客服：很抱歉您的订单延迟了，我们可以补偿20元代金券
    顾客：我要求全额退款
    客服：这不符合规定，最多可以补偿50元"
    
    示例输出：
    [
    "客服与顾客",
    "协商订单延迟补偿方案",
    "达成部分和解：补偿金额提高至50元"
    ]
    """

    prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system", prompt_text),
            MessagesPlaceholder("chat_history"),
            ("human", f"我这次的对话内容为{user_input}")
        ]
    )

    mem = str(ChatAssistant.get_or_none(id=history_id))
    history.append(HumanMessage(content=mem))

    messages = prompt_template.invoke({
        "user_input": user_input,
        "chat_history": history
    })

    responses = model.invoke(input=messages)

    #获取响应信息
    msgs = json.loads(responses.content)
    role = msgs[0]
    event = msgs[1]
    result = msgs[2]

    await ChatAssistant.create(role=role,event=event,result=result,history=user_input)

    return responses.content

async def generate_text_by_subject(api_key:str, subject:str, time:int, temperature:float):
    """
    使用ds v3 生成视频标题文案
    subject: 主题
    time: 时常
    temperature: 相关度
    return 生产的文本内容
    """

    model = init_chat_model(model="deepseek-v3",
                            model_provider="openai",
                            api_key=api_key,
                            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                            temperature=temperature,
                            max_tokens=200
                            )

    #首先根据用户给出的主题生成对应视频文案标题
    prompt_text = """
        (C) 上下文：
        输入视频主题关键词（如"Python教程"、"健身干货"、"科技测评"）
        
        (O) 目标：
        生成5个高传播性的短视频爆款标题
        
        (S) 风格：
        抖音/B站/YouTube Shorts爆款风格
        
        (T) 语气：
        高冲击力、强引导性、激发点击欲
        
        (A) 受众：
        18-35岁短视频平台活跃用户
        
        (R) 响应：
        仅输出字符串数组格式的标题
        [
        "Python三天速成｜从零到项目实战🔥",
        "健身教练绝不外传的5个秘密动作💪",
        "这款黑科技产品让我直接扔了手机❗️",
        "90%人不知道的Excel隐藏功能💎",
        "⚠️行业大佬绝不会告诉你的理财真相⚡"
        ]
    """

    prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system", prompt_text),
            ("human", f"我的主题是{subject}")
        ]
    )

    messages = prompt_template.invoke({
        "subject": subject
    })

    responses = model.invoke(input=messages)

    #获取上一步生成的标题并根据其中一个标题生成对应时长的视频文案内容

    titles = json.loads(responses.content)

    title = titles[0]

    prompt = """
        (C) 上下文：
        用户提供视频标题和时长（如「5个隐藏的iPhone技巧｜3分钟」「健身小白避坑指南｜8分钟」）
        
        (O) 目标：
        根据标题和时长生成连贯的短视频口播文案
        
        (S) 风格：
        生活化娱乐风格｜自然口语化｜适当玩梗
        
        (T) 语气：
        轻松活泼｜带点小幽默｜避免说教感
        
        (A) 受众：
        18-35岁刷短视频消遣的普通用户
        
        (R) 响应：
        一段文本即可
        "大家好呀～今天我们用[时长]分钟，来搞定这个超实用的《[标题]》！知道你们都没耐心看长视频，我特意把节奏加快3倍速，保证看完就能用上！先说好哈，看到最后有彩蛋...（突然压低声音）其实是因为我忘了剪掉后期小哥的打嗝声（笑）好啦不废话，上干货！"
        
        （生成示例：输入「5个隐藏的iPhone技巧｜3分钟」）
        "姐妹们快集合！3分钟教会你们5个苹果手机骚操作～第一个功能我赌10杯奶茶你们绝对没用过！双击屏幕点赞，马上解锁这个能让隔壁安卓用户馋哭的隐藏技巧！最后一个功能简直离谱...库克看了都想给我打钱！"
        
        /// 特点 ///
        
        开头3秒内抛出价值点
        中途穿插「赌10杯奶茶」「库克打钱」等生活化梗
        结尾用「最后提醒下...」自然引导互动
        自动匹配输入时长调整语速提示（如3分钟会说「加速讲解」）
    """
    text = ChatPromptTemplate.from_messages(
        [
            ("system",prompt),
            ("human",f"我的视频标题是:{title},时长是:{time}分钟")
        ]
    )

    messages = text.invoke({
        "title": title,
        "time": time
    })

    responses = model.invoke(input=messages)

    return responses.content

async def xhs_generate_text_by_subject(api_key:str, subject:str, target:str):
    """
    使用ds v3 生成小红书文案
    subject: 主题
    target: 目的
    return 生产的文本内容
    """
    model = init_chat_model(model="deepseek-v3",
                            model_provider="openai",
                            api_key=api_key,
                            base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
                            temperature=0.5,
                            max_tokens=200
                            )

    prompt_text = """
    (C) 上下文：
    用户提供任意主题关键词和目的（如"早八妆容"、"露营装备"、"考研经验"，目的是推销产品，卖书等）
    
    (O) 目标：
    生成符合小红书平台调性的完整文案（标题+正文+标签）
    
    (S) 风格：
    生活化分享｜强互动感｜适当使用表情符号
    
    (T) 语气：
    亲切自然｜带点小俏皮｜避免过度商业化
    
    (A) 受众：
    18-25岁喜欢浏览种草内容的年轻女性
    
    (R) 响应：
    
    📌【标题】5分钟搞定早八伪素颜！被同事追问了800次的通勤妆
    
    （空一行）
    姐妹们！这个妆容我连画一周了！！
    每天多睡20分钟不是梦✨
    重点就是三步：
    1️⃣ 水乳后直接拍气垫（选比肤色亮0.5度的）
    2️⃣ 腮红膏当眼影用！手指抹开超方便～
    3️⃣ 睫毛只夹眼中段！伪素颜小心机💡
    
    （空一行）
    ⚠️避雷提醒：定妆千万别用散粉！
    喷两次保湿喷雾更服帖（亲测拯救卡粉）
    
    （空一行）
    #早八人必备 #快速化妆技巧 #伪素颜天花板
    
    
    /// 生成规则 ///
    
    标题必带emoji和具体数字
    正文使用"姐妹""亲测"等亲近称呼
    每3行必有1个表情符号
    标签含2个常规词+1个夸张词（如"天花板"）
    自动匹配用户输入主题生成场景化内容（如输入"考研"会生成自习室场景建议）
    """

    text = ChatPromptTemplate.from_messages(
        [
            ("system",prompt_text),
            ("human",f"我的主题是{subject}，我的目的是{target}")
        ]
    )

    messages = text.invoke({
        "subject" : subject,
        "target" : target
    })

    responses = model.invoke(input=messages)

    return responses.content


